package logic

// Rule 规则
type Rule struct {
	Name  string   // 名称
	Vars  []string // 变量
	Facts []*Fact  // 定义
}

// NewRule 新建规则
func NewRule(name string, vars ...string) *Rule {
	rule := &Rule{Name: name, Vars: vars}
	return rule
}

// Fact 事实
func (r *Rule) Fact(facts ...*Fact) *Rule {
	r.Facts = append(r.Facts, facts...)
	return r
}

// And 与事实
func (r *Rule) And(name, target string, others ...string) *Rule {
	return r.Fact(NewFact(And, name, target, others...))
}

// Filter 过滤
func (r *Rule) Filter(facts []*Fact) []*Fact {
	fs := []*Fact{}
	// TODO算法不对，需要使用递归
	// for _, rf := range r.Facts {
	// 	vars := NewVars()
	// 	for _, f := range facts {
	// 		if rf.Name == f.Name {
	// 			vars.Add(rf, f)
	// 		}
	// 	}
	// }

	// TODO 需要使用递归
	// TODO 进行不下去，需要看看人家的源码
	return fs
}
